<?php

namespace app\common\traits;


use yiqiniu\extend\library\Token;

trait AuthTrait
{
    protected $_appField = 'app';
    protected $_authField = 'authorization';

    /**
     * 检测是否免认证
     * @param       $request
     * @param array $no_auth 免认证列表
     * @return bool  true 免认证   false:需要认证
     */
    public function checkNoAuth($request, array $no_auth = []): bool
    {
        if (empty($no_auth)) {
            return false;
        }
        $controller = strtolower($request->controller());
        $action = strtolower($request->action());
        // 不需要认证,直接下一个操作
        // 1.直接在路由中配置的参数,无需参加认证
        // 2.操作不需要认证的
        // 3.控制器不需要认证的
        if (($controller === '' && $action === '') ||
            in_array($controller . '/' . $action, $no_auth['action'] ?? [], true) ||
            in_array($controller, $no_auth['controller'] ?? [], true)) {
            return true;
        }
        return false;
    }


    /**
     * 解析认证信息
     * @param array  $header 头部信息
     * @param string $tokenKey
     * @return array
     * @throws \Exception
     */
    public function parseHeaderAuthorization(array $header, string $tokenKey = ''): array
    {
        //获取用户的认证信息
        if (empty($tokenKey)) {
            $tokens = config('config.token', []);
            $tokenKey = $tokens['jwt'] ?? '';
        }
        $authInfo = $header[$this->_authField] ?? '';
        if (empty($authInfo)) {
            $authInfo = $header[ucfirst($this->_authField)] ?? '';
        }
        if ($authInfo !== '') {
            $app = $this->parseHeaderApp($header);
            return (new Token($tokenKey))->verifyToken($authInfo, $app);
        }
        return [];
    }


    /**
     *  解析header中的App
     * @param array $header
     * @return string
     */
    public function parseHeaderApp(array $header): string
    {
        //加入对APP的处理
        return $header[$this->_appField] ?? '';
    }
}
